﻿using System;
using System.Collections.Generic;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLPresupuestoMantenimiento
    /// </summary>
    class BLIMPLPresupuestoMantenimiento:Presupuesto_BL.BLPresupuestoMantenimiento
    {
        DAOPresupuestoMantenimiento createPresupuestoMantenimiento = DAOFactoryPresupuesto.createPresupuestoMantenimiento();
        BLMantenimiento createMantenimiento = BLFactoryPresupuesto.createMantenimiento();
        BLPresupuestos createPresupuesto = BLFactoryPresupuesto.createPresupuesto();

        /// <summary>
        /// Guarda las tareas de mantenimiento asociadas a un presupuesto
        /// </summary>
        /// <param name="preMan">Objeto con los datos de las tareas asociadas a un presupuesto</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuestoMantenimiento(presupuestoMantenimientoDTO preMan)
        {
            Boolean correcto = false;

            try
            {
                DataTable tareas = createMantenimiento.getAllMantenimiento();

                foreach (string nombre in preMan.Tarea)
                {
                    int idTarea = Convert.ToInt16(tareas.Select("nombre_tarea = '" + nombre + "'")[0]["id"].ToString());
                    presupuestosDTO p = createPresupuesto.getPresupuesto(preMan.CodigoPresupuesto);

                    if (null != p)
                    {
                        Boolean insertado = createPresupuestoMantenimiento.savePresupuestoMantenimiento(p.ID, idTarea);

                        if (insertado)
                        {
                            correcto = true;
                        }    
                    }
                    
                }
   
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica las tareas de mantenimiento asociadas a un presupuesto
        /// </summary>
        /// <param name="preMan">Objeto con los datos de las tareas asociadas a un presupuesto</param>
        /// <param name="idP">Determina el presupuesto a modificar</param>
        /// <param name="tv">Lista con las tareas anteriores</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuestoMantenimiento(presupuestoMantenimientoDTO preMan, int idP, List<string> tv)
        {
            Boolean correcto = false;

            try
            {
                Boolean borrado = createPresupuestoMantenimiento.deletePresupuestoMantenimiento(idP);
                if (borrado)
                {
                    foreach (string nombre in preMan.Tarea)
                    {
                        int idTarea = createMantenimiento.getMantenimiento(nombre).ID;
                        presupuestosDTO p = createPresupuesto.getPresupuesto(preMan.CodigoPresupuesto);

                        if (null != p)
                        {
                            Boolean modificado = createPresupuestoMantenimiento.savePresupuestoMantenimiento(p.ID, idTarea);

                            if (modificado)
                            {
                                correcto = true;
                            }
                        }

                    }    
                }
                        
             }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Eliminar el presupuesto y las tareas de mantenimiento asociadas
        /// </summary>
        /// <param name="id">Determina el presupuesto a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuestoMantenimiento(int id)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createPresupuestoMantenimiento.deletePresupuestoMantenimiento(id);

                if (eliminado)
                {
                    correcto = true;
                }

            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista los presupuestos de mantenimiento
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuestoMantenimiento()
        {
            DataTable listadoPresupuestoMantenimiento = null;

            try
            {
                DataTable preMan = createPresupuestoMantenimiento.getAllPresupuestoMantenimiento();

                if (null != preMan)
                {
                    listadoPresupuestoMantenimiento = preMan;
                }
            }
            catch (Exception ex)
            {

                listadoPresupuestoMantenimiento = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoPresupuestoMantenimiento;
        }

        /// <summary>
        /// Obtiene un presupuesto de mantenimiento
        /// </summary>
        /// <param name="codigoPresupuesto">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuestoMantenimiento</returns>
        public presupuestoMantenimientoDTO getPresupuestoMantenimiento(string codigoPresupuesto)
        {
            presupuestoMantenimientoDTO preMan = null;

            try
            {
                presupuestoMantenimiento pm = createPresupuestoMantenimiento.getPresupuestoMantenimiento(codigoPresupuesto);

                if (null != pm)
                {
                    preMan = new presupuestoMantenimientoDTO();
                    preMan.Tarea = pm.Tarea;
                    preMan.Precio = pm.Precio;
                    preMan.Fecha = pm.Fecha;
                    preMan.EstadoPresupuesto = pm.EstadoPresupuesto;
                    preMan.DescripcionTarea = pm.DescripcionTarea;
                    preMan.CodigoPresupuesto = pm.CodigoPresupuesto;
                }
            }
            catch (Exception ex)
            {

                preMan = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return preMan;
        }
    }
}
